﻿;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 原：统计字符数. 小众计数器未提供源码，自己实现
; gaochao.morgen@gmail.com
; 2015/6/21
;----------------------------------------------
;	如初
; 修改补充适合starter使用
; 补充一些简单功能
;	2020/10/14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#SingleInstance Force
#NoEnv

if A_Args[1]
	str:=A_Args
else
	str:=ClipBoard

gui, +ToolWindow +E0x40000
Gui, Color, FFFFFF, FFFFFF
Gui, font, s13 , SimHei
gui, Margin, 10, 10

gui,  Add, Edit, xm ym g统计 vstr w300 h145, %str%

Gui, font, s12

gui,  add, Text, xp+320 yp  w200 h20 vresult1, 中文:
gui,  add, Text, xp yp+20  w200 h20 vresult2, 中文+空格:
gui,  add, Text, xp yp+20  w200 h20 vresult3, 英文词数:
gui,  add, Text, xp yp+20 w200 h20 vresult4, 空格:
gui,  add, Text, xp yp+20 w200 h20 vresult5, 其他:
gui,  add, Text, xp yp+20 w200 h20 vresult6, 字符长度:

gui, add, Text, xp yp+30,  [热键(F12):统计选中文字]

gosub 统计
gui, Show, ,统计字符数  ~By 如初

Loop 6
{
	复制%A_Index%:=Func("copy_tip").Bind(A_Index)
	GuiControl +g, result%A_Index%, % 复制%A_Index%
}

Return

GuiClose:
GuiEscape:
ExitApp



统计:
gui, Submit, NoHide
	ChCount := ChineseCount(str)
	EnCount := EnglishCount(str)
	StrLen:=StrLen(str)
	StrReplace(str, A_Space, , spaceCount) 
	for a,b in ["中文:`t`t" ChCount, "中文+空格:`t" ChCount+spaceCount, "英文词数:`t" EnCount, "空格:`t`t" spaceCount, "其他:`t`t" StrLen - ChCount - EnCount - spaceCount, "字符长度:`t" StrLen]
	{
	GuiControl, , Result%A_Index%, % b
	}
Return

$F12::
	ClipSaved := ClipboardAll
	ClipBoard :=  
	Send ^c 
	ClipWait, 5 
	
	str:=ClipBoard
	ClipBoard := ClipSaved 		; 恢复剪切板的内容
	GuiControl, , str, %str%
	gosub 统计
	gui, show
Return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                       函数                            ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
copy_tip(num){
	GuiControlGet, a, , Result%num%
	ClipBoard:=StrReplace(a, "`t")
	Tip("已复制：" ClipBoard, , , , num)
	Return
}

Tip(Text:="", time:=1000 ,x:=-100, y:=-100, tip_num:=1){
	Critical, On
	if (x=-100 and y=-100)
		ToolTip, %Text%, , , %tip_num%
	else
		ToolTip, %Text%, %x%, %y%, %tip_num%
	fn := Func("f_RemoveToolTip").Bind(tip_num)
	SetTimer, %fn% , -%time%
	return
}

f_RemoveToolTip(tip_num){
ToolTip, , , , %tip_num%
return
}

; 统计中文字符
ChineseCount(Input)
{
	Count := 0
	
	; AHKL对一个UTF-8编码的汉字，会循环2次(没办法就当是两个字符吧)
	Loop, Parse, Input
	{
		if (Asc(A_LoopField) >= 19968 and	Asc(A_LoopField) <= 40907) ; 此范围的是基本汉字
			Count := Count + 1
	}

	Return Count
}

; 统计英文字符
EnglishCount(Input)
{
	StringReplace, Input, Input, ', x, All	; It's -> Itxs，视为一个单词
	StringReplace, Input, Input, -, x, All	; well-defined -> wellxdefined，视为一个单词
	RegExReplace(Input, "\w+", "", Count) 	; PhiLho 

	Return Count
}

; 显示统计结果
ShowResult(ChCount, EnCount, spaceCount ,StrLen)
{
	Result := "中文:`t`t" ChCount
	Result .= "`r`n"
	Result .= "中文+空格:`t" ChCount+spaceCount
	Result .= "`r`n"
	Result .= "英文词数:`t" EnCount
	Result .= "`r`n"
	Result .= "空格:`t`t" spaceCount
	Result .= "`r`n"
	Result .= "其他:`t`t"
	Result .= StrLen - ChCount - EnCount - spaceCount
	Result .= "`r`n"
	Result .= "字符长度:`t" StrLen

	Return Result
}

